package nl.hu.vakantievibes.ui;

import java.util.ArrayList;
import java.util.Date;

import nl.hu.vakantievibes.client.ServerCall;
import nl.hu.vakantievibes.client.Systeem;
import nl.hu.vakantievibes.domain.Boeking;
import nl.hu.vakantievibes.domain.Carpool;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;

public class MijnBoekingen {
	VerticalPanel vp;
	HorizontalPanel hp, hp2;
	Label naamLabel, naamLabel2, naamLabel3, naamLabel4, naamLabel5, naamLabel6;
	Label locatieLabel, kostenLabel, datum, carpoolOpties;
	Label details;
	Button acties;

	public MijnBoekingen() {

	}

	public Panel createPage() {
		vp = new VerticalPanel();
		hp2 = new HorizontalPanel();
		naamLabel2 = new Label("Reis:");
		naamLabel2.addStyleName("labelstyle2b");
		naamLabel3 = new Label("Plaats:");
		naamLabel3.addStyleName("labelstyle2b");
		naamLabel4 = new Label("Datum:");
		naamLabel4.addStyleName("labelstyle2b");
		naamLabel5 = new Label("Carpool:");
		naamLabel5.addStyleName("labelstyle2b");
		naamLabel6 = new Label("Actie:");
		naamLabel6.addStyleName("labelstyle2b");

		hp2.add(naamLabel2);
		hp2.add(naamLabel3);
		hp2.add(naamLabel4);
		hp2.add(naamLabel5);
		hp2.add(naamLabel6);
		vp.add(hp2);

		getBoekingen();
		return vp;
	}

	public void getBoekingen(){	
		AsyncCallback<ArrayList<Boeking>> callback = new AsyncCallback<ArrayList<Boeking>>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een server fout opgetreden. De reizen konden niet worden opgehaald van de server.");
				GWT.log(caught.getMessage());
				caught.printStackTrace();
			}
			@Override
			public void onSuccess(ArrayList<Boeking> result) {
				if(result.size() == 0){
					NotificationManager.get().createNotification("Er zijn nog geen boekingen gemaakt.");
				}else{
					for(final Boeking b : result){
						if(Systeem.get().getGebruiker().getGebruikersNaam().equals(b.getDeGebruiker().getGebruikersNaam())){
							hp = new HorizontalPanel();
							naamLabel = new Label(b.getDeReis().getNaam()); 

							naamLabel.addStyleName("labelstyle1a");
							locatieLabel = new Label(b.getDeReis().getPlaats() + "," + b.getDeReis().getLand()); 
							locatieLabel.addStyleName("labelstyle1a");
							datum = new Label(changeDate(b.getDeReis().getVertrekDatum()) + " t/m " + changeDate(b.getDeReis().getAankomstDatum()));
							datum.addStyleName("labelstyle1a");
							carpoolOpties = new Label("Opties");
							carpoolOpties.addStyleName("details-link");	
							carpoolOpties.addStyleName("labelstyle1a");
							carpoolOpties.addClickHandler(new ClickHandler() {
								@Override
								public void onClick(ClickEvent event) {
									if(b.getAuto()) {
										History.newItem("boeking-uitnodigingen-" + b.getDeReis().getNaam());
									} else {
										History.newItem("boeking-autos-" + b.getDeReis().getNaam());
									}
								}
							});
							acties = new Button("Annuleren");
							acties.addClickHandler(new ClickHandler() {
								@Override
								public void onClick(ClickEvent event) {
									annuleerBoeking(b);
								}
							});
							
							hp.add(naamLabel);
							hp.add(locatieLabel);
							hp.add(datum);
							hp.add(carpoolOpties);
							hp.add(acties);
							vp.add(hp);
						}
					}
				}
			}
		};
		new ServerCall().getAlleBoekingen(callback);
	}
	
	public void annuleerBoeking(Boeking b) {
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een server fout opgetreden. De boeking kon niet worden geannuleerd.");
				GWT.log(caught.getMessage());
				caught.printStackTrace();
			}
			@Override
			public void onSuccess(Boolean result) {
				if(result) {
					NotificationManager.get().createNotification("De boeking is succesvol geannuleerd.");
				} else {
					NotificationManager.get().createNotification("De boeking kon niet worden geannuleerd");
				}
				History.newItem("allereizen");				
			}
		};
		new ServerCall().annuleerBoeking(b, callback);
	}

	public String changeDate(Date dt)
	{
		DateTimeFormat dtf = DateTimeFormat.getFormat("dd-MM-yyyy");
		return dtf.format(dt);
	}
}
